package transaction

import (
	"HeadLineNews/pkg/zaplog"
	"github.com/jmoiron/sqlx"
	"go.uber.org/zap"
)

// Transaction 数据库事务
func Transaction(db *sqlx.DB, transFunc func(tx *sqlx.Tx) error) (err error) {
	var tx *sqlx.Tx
	defer func() {
		// 回滚事务
		if err != nil {
			if re := tx.Rollback(); re != nil {
				zaplog.CallerL().Error("rollback trans failed", zap.String("error", re.Error()))
				return
			}
		}
	}()
	// 开始事务
	if tx, err = db.Beginx(); err != nil {
		zaplog.CallerL().Error("start trans failed", zap.String("error", err.Error()))
		return
	}
	// 执行事务
	if err = transFunc(tx); err != nil {
		return
	}
	// 提交事务
	if err = tx.Commit(); err != nil {
		zaplog.CallerL().Error("commit trans failed", zap.String("error", err.Error()))
		return
	}
	return
}
